{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "34qVD_ntSKLF"
   },
   "source": [
    "# Cvxpylayers + Neuromancer + Lightning\n",
    "\n",
    "This notebook is equivalent to parametric_programing/Part_5_cvxpy_layers.ipynb. In this version we showcase the use of **PyTorch-Lightning** to simplify the user workflow. \n",
    "\n",
    "This example demonstrates integration of Cvxpylayers into Neuromancer.\n",
    "We will demonstrate this capability on learning to optimize\n",
    "for [parametric nonlinear programming problem (pNLP)](https://en.wikipedia.org/wiki/Parametric_programming) defined as:\n",
    "\n",
    "$$\n",
    "\\begin{align}\n",
    "&\\text{minimize } &&  f(x, \\theta) \\\\\n",
    "&\\text{subject to} && g(x, \\theta) \\le 0\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "with  parameters $\\theta$ and decision variables $x$.\n",
    "\n",
    "\n",
    "### Cvxpy Layes References\n",
    "[1] [Agrawal, A. and Amos, B. and Barratt, S. and Boyd, S. and Diamond, S. and Kolter, Z., Differentiable Convex Optimization Layers, NeurIPS 2019](https://arxiv.org/abs/1910.12430)  \n",
    "[2] https://github.com/cvxgrp/cvxpylayers/tree/master  \n",
    "[3] https://locuslab.github.io/2019-10-28-cvxpylayers/  \n",
    "\n",
    "### Learning to Optimize References\n",
    "[1] [F. Fioretto, et al., Predicting AC Optimal Power Flows: Combining Deep Learning and Lagrangian Dual Methods, 2019](https://arxiv.org/abs/1909.10461)  \n",
    "[2] [S. Gould, et al., Deep Declarative Networks: A New Hope, 2020](https://arxiv.org/abs/1909.04866)  \n",
    "[3] [P. Donti, et al., DC3: A learning method for optimization with hard constraints, 2021](https://arxiv.org/abs/2104.12225)  \n",
    "[4] [J. Kotary, et al., End-to-End Constrained Optimization Learning: A Survey, 2021](https://arxiv.org/abs/2103.16378)  \n",
    "[5] [M. Li, et al., Learning to Solve Optimization Problems with Hard Linear Constraints, 2022](https://arxiv.org/abs/2208.10611)  \n",
    "[6] [R. Sambharya, et al., End-to-End Learning to Warm-Start for Real-Time Quadratic Optimization, 2022](https://arxiv.org/abs/2212.08260)  \n",
    "[7] [Parametric programming in Neuromancer](https://github.com/pnnl/neuromancer/tree/master/examples/parametric_programming)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "OCn3zpaIqgMc"
   },
   "source": [
    "## NeuroMANCER and Dependencies"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Qzy5Wot5k2Gf"
   },
   "source": [
    "### Install (Colab only)\n",
    "Skip this step when running locally."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 1000
    },
    "id": "X_3EvkSz0Fnz",
    "outputId": "23c06f6b-ab48-4763-c43c-40a325cacf87"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Collecting neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master\n",
      "  Cloning https://github.com/pnnl/neuromancer.git (to revision master) to /tmp/pip-install-53vktbvg/neuromancer_65ef9f1060f0401cb2ec971b8342f147\n",
      "  Running command git clone --filter=blob:none --quiet https://github.com/pnnl/neuromancer.git /tmp/pip-install-53vktbvg/neuromancer_65ef9f1060f0401cb2ec971b8342f147\n",
      "  Resolved https://github.com/pnnl/neuromancer.git to commit e0f02e592ce32584a03fba52d422aad4bbb4276d\n",
      "  Installing build dependencies ... \u001b[?25ldone\n",
      "\u001b[?25h  Getting requirements to build wheel ... \u001b[?25ldone\n",
      "\u001b[?25h  Installing backend dependencies ... \u001b[?25ldone\n",
      "\u001b[?25h  Preparing metadata (pyproject.toml) ... \u001b[?25ldone\n",
      "\u001b[?25hRequirement already satisfied: dill in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (0.3.7)\n",
      "Requirement already satisfied: graphviz in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (0.20.1)\n",
      "Requirement already satisfied: matplotlib in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (3.8.2)\n",
      "Requirement already satisfied: mlflow==2.5.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (2.5.0)\n",
      "Requirement already satisfied: networkx==3.0.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (3.0)\n",
      "Requirement already satisfied: numpy<1.24.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (1.23.5)\n",
      "Requirement already satisfied: pandas in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (2.1.3)\n",
      "Requirement already satisfied: plum-dispatch==1.7.3 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (1.7.3)\n",
      "Requirement already satisfied: scikit-learn in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (1.3.2)\n",
      "Requirement already satisfied: scipy in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (1.11.4)\n",
      "Requirement already satisfied: six in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (1.16.0)\n",
      "Requirement already satisfied: pydot==1.4.2 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (1.4.2)\n",
      "Requirement already satisfied: pyts in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (0.13.0)\n",
      "Requirement already satisfied: torch in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (2.0.0)\n",
      "Requirement already satisfied: torchdiffeq in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (0.2.3)\n",
      "Requirement already satisfied: toml in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (0.10.2)\n",
      "Requirement already satisfied: casadi in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (3.6.4)\n",
      "Requirement already satisfied: cvxpy in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (1.4.1)\n",
      "Requirement already satisfied: imageio in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (2.33.0)\n",
      "Requirement already satisfied: cvxpylayers in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (0.1.6)\n",
      "Requirement already satisfied: click<9,>=7.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (8.1.7)\n",
      "Requirement already satisfied: cloudpickle<3 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (2.2.1)\n",
      "Requirement already satisfied: databricks-cli<1,>=0.8.7 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (0.18.0)\n",
      "Requirement already satisfied: entrypoints<1 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (0.4)\n",
      "Requirement already satisfied: gitpython<4,>=2.1.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (3.1.40)\n",
      "Requirement already satisfied: pyyaml<7,>=5.1 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (6.0.1)\n",
      "Requirement already satisfied: protobuf<5,>=3.12.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (4.23.4)\n",
      "Requirement already satisfied: pytz<2024 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (2023.3.post1)\n",
      "Requirement already satisfied: requests<3,>=2.17.3 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (2.31.0)\n",
      "Requirement already satisfied: packaging<24 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (23.2)\n",
      "Requirement already satisfied: importlib-metadata!=4.7.0,<7,>=3.7.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (6.11.0)\n",
      "Requirement already satisfied: sqlparse<1,>=0.4.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (0.4.4)\n",
      "Requirement already satisfied: alembic!=1.10.0,<2 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (1.13.0)\n",
      "Requirement already satisfied: docker<7,>=4.0.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (6.1.3)\n",
      "Requirement already satisfied: Flask<3 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (2.3.3)\n",
      "Requirement already satisfied: querystring-parser<2 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (1.2.4)\n",
      "Requirement already satisfied: sqlalchemy<3,>=1.4.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (2.0.23)\n",
      "Requirement already satisfied: pyarrow<13,>=4.0.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (12.0.1)\n",
      "Requirement already satisfied: markdown<4,>=3.3 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (3.5.1)\n",
      "Requirement already satisfied: gunicorn<21 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (20.1.0)\n",
      "Requirement already satisfied: Jinja2<4,>=2.11 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (3.1.2)\n",
      "Requirement already satisfied: pyparsing>=2.1.4 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from pydot==1.4.2->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (3.1.1)\n",
      "Requirement already satisfied: contourpy>=1.0.1 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from matplotlib->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (1.2.0)\n",
      "Requirement already satisfied: cycler>=0.10 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from matplotlib->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (0.12.1)\n",
      "Requirement already satisfied: fonttools>=4.22.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from matplotlib->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (4.46.0)\n",
      "Requirement already satisfied: kiwisolver>=1.3.1 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from matplotlib->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (1.4.5)\n",
      "Requirement already satisfied: pillow>=8 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from matplotlib->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (10.1.0)\n",
      "Requirement already satisfied: python-dateutil>=2.7 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from matplotlib->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (2.8.2)\n",
      "Requirement already satisfied: tzdata>=2022.1 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from pandas->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (2023.3)\n",
      "Requirement already satisfied: joblib>=1.1.1 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from scikit-learn->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (1.3.2)\n",
      "Requirement already satisfied: threadpoolctl>=2.0.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from scikit-learn->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (3.2.0)\n",
      "Requirement already satisfied: osqp>=0.6.2 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from cvxpy->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (0.6.3)\n",
      "Requirement already satisfied: ecos>=2 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from cvxpy->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (2.0.12)\n",
      "Requirement already satisfied: clarabel>=0.5.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from cvxpy->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (0.6.0)\n",
      "Requirement already satisfied: scs>=3.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from cvxpy->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (3.2.4.post1)\n",
      "Requirement already satisfied: pybind11 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from cvxpy->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (2.11.1)\n",
      "Requirement already satisfied: diffcp>=1.0.13 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from cvxpylayers->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (1.0.23)\n",
      "Requirement already satisfied: numba>=0.55.2 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from pyts->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (0.58.1)\n",
      "Requirement already satisfied: filelock in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (3.13.1)\n",
      "Requirement already satisfied: typing-extensions in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (4.8.0)\n",
      "Requirement already satisfied: sympy in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (1.12)\n",
      "Requirement already satisfied: nvidia-cuda-nvrtc-cu11==11.7.99 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (11.7.99)\n",
      "Requirement already satisfied: nvidia-cuda-runtime-cu11==11.7.99 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (11.7.99)\n",
      "Requirement already satisfied: nvidia-cuda-cupti-cu11==11.7.101 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (11.7.101)\n",
      "Requirement already satisfied: nvidia-cudnn-cu11==8.5.0.96 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (8.5.0.96)\n",
      "Requirement already satisfied: nvidia-cublas-cu11==11.10.3.66 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (11.10.3.66)\n",
      "Requirement already satisfied: nvidia-cufft-cu11==10.9.0.58 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (10.9.0.58)\n",
      "Requirement already satisfied: nvidia-curand-cu11==10.2.10.91 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (10.2.10.91)\n",
      "Requirement already satisfied: nvidia-cusolver-cu11==11.4.0.1 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (11.4.0.1)\n",
      "Requirement already satisfied: nvidia-cusparse-cu11==11.7.4.91 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (11.7.4.91)\n",
      "Requirement already satisfied: nvidia-nccl-cu11==2.14.3 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (2.14.3)\n",
      "Requirement already satisfied: nvidia-nvtx-cu11==11.7.91 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (11.7.91)\n",
      "Requirement already satisfied: triton==2.0.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (2.0.0)\n",
      "Requirement already satisfied: setuptools in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from nvidia-cublas-cu11==11.10.3.66->torch->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (68.2.2)\n",
      "Requirement already satisfied: wheel in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from nvidia-cublas-cu11==11.10.3.66->torch->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (0.42.0)\n",
      "Requirement already satisfied: cmake in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from triton==2.0.0->torch->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (3.27.9)\n",
      "Requirement already satisfied: lit in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from triton==2.0.0->torch->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (17.0.6)\n",
      "Requirement already satisfied: Mako in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from alembic!=1.10.0,<2->mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (1.3.0)\n",
      "Requirement already satisfied: pyjwt>=1.7.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from databricks-cli<1,>=0.8.7->mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (2.8.0)\n",
      "Requirement already satisfied: oauthlib>=3.1.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from databricks-cli<1,>=0.8.7->mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (3.2.2)\n",
      "Requirement already satisfied: tabulate>=0.7.7 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from databricks-cli<1,>=0.8.7->mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (0.9.0)\n",
      "Requirement already satisfied: urllib3<3,>=1.26.7 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from databricks-cli<1,>=0.8.7->mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (2.1.0)\n",
      "Requirement already satisfied: websocket-client>=0.32.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from docker<7,>=4.0.0->mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (1.7.0)\n",
      "Requirement already satisfied: Werkzeug>=2.3.7 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from Flask<3->mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (3.0.1)\n",
      "Requirement already satisfied: itsdangerous>=2.1.2 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from Flask<3->mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (2.1.2)\n",
      "Requirement already satisfied: blinker>=1.6.2 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from Flask<3->mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (1.7.0)\n",
      "Requirement already satisfied: gitdb<5,>=4.0.1 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from gitpython<4,>=2.1.0->mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (4.0.11)\n",
      "Requirement already satisfied: zipp>=0.5 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from importlib-metadata!=4.7.0,<7,>=3.7.0->mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (3.17.0)\n",
      "Requirement already satisfied: MarkupSafe>=2.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from Jinja2<4,>=2.11->mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (2.1.3)\n",
      "Requirement already satisfied: llvmlite<0.42,>=0.41.0dev0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from numba>=0.55.2->pyts->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (0.41.1)\n",
      "Requirement already satisfied: qdldl in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from osqp>=0.6.2->cvxpy->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (0.1.7.post0)\n",
      "Requirement already satisfied: charset-normalizer<4,>=2 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from requests<3,>=2.17.3->mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (3.3.2)\n",
      "Requirement already satisfied: idna<4,>=2.5 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from requests<3,>=2.17.3->mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (3.6)\n",
      "Requirement already satisfied: certifi>=2017.4.17 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from requests<3,>=2.17.3->mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (2023.11.17)\n",
      "Requirement already satisfied: greenlet!=0.4.17 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from sqlalchemy<3,>=1.4.0->mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (3.0.1)\n",
      "Requirement already satisfied: mpmath>=0.19 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from sympy->torch->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (1.3.0)\n",
      "Requirement already satisfied: smmap<6,>=3.0.1 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from gitdb<5,>=4.0.1->gitpython<4,>=2.1.0->mlflow==2.5.0->neuromancer[examples]@ git+https://github.com/pnnl/neuromancer.git@master) (5.0.1)\n",
      "Building wheels for collected packages: neuromancer\n",
      "  Building wheel for neuromancer (pyproject.toml) ... \u001b[?25ldone\n",
      "\u001b[?25h  Created wheel for neuromancer: filename=neuromancer-1.4.2-py3-none-any.whl size=153920 sha256=6b6ea703a02095068498e2871644edbf895e203fa32d9e06f74c131b00c2f9f2\n",
      "  Stored in directory: /tmp/pip-ephem-wheel-cache-nqxsquma/wheels/88/db/69/58e642f880e17cca6125cfc7a8bcc17b296381c19d2b6598d1\n",
      "Successfully built neuromancer\n",
      "Installing collected packages: neuromancer\n",
      "  Attempting uninstall: neuromancer\n",
      "    Found existing installation: neuromancer 1.4.2\n",
      "    Uninstalling neuromancer-1.4.2:\n",
      "^C\n",
      "\u001b[31mERROR: Operation cancelled by user\u001b[0m\u001b[31m\n",
      "\u001b[0mRequirement already satisfied: lightning in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (2.1.2)\n",
      "Requirement already satisfied: PyYAML<8.0,>=5.4 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from lightning) (6.0.1)\n",
      "Requirement already satisfied: fsspec<2025.0,>2021.06.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from fsspec[http]<2025.0,>2021.06.0->lightning) (2023.12.1)\n",
      "Requirement already satisfied: lightning-utilities<2.0,>=0.8.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from lightning) (0.10.0)\n",
      "Requirement already satisfied: numpy<3.0,>=1.17.2 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from lightning) (1.23.5)\n",
      "Requirement already satisfied: packaging<25.0,>=20.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from lightning) (23.2)\n",
      "Requirement already satisfied: torch<4.0,>=1.12.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from lightning) (2.0.0)\n",
      "Requirement already satisfied: torchmetrics<3.0,>=0.7.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from lightning) (1.2.1)\n",
      "Requirement already satisfied: tqdm<6.0,>=4.57.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from lightning) (4.66.1)\n",
      "Requirement already satisfied: typing-extensions<6.0,>=4.0.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from lightning) (4.8.0)\n",
      "Requirement already satisfied: pytorch-lightning in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from lightning) (2.1.2)\n",
      "Requirement already satisfied: requests in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from fsspec[http]<2025.0,>2021.06.0->lightning) (2.31.0)\n",
      "Requirement already satisfied: aiohttp!=4.0.0a0,!=4.0.0a1 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from fsspec[http]<2025.0,>2021.06.0->lightning) (3.9.1)\n",
      "Requirement already satisfied: setuptools in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from lightning-utilities<2.0,>=0.8.0->lightning) (68.2.2)\n",
      "Requirement already satisfied: filelock in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch<4.0,>=1.12.0->lightning) (3.13.1)\n",
      "Requirement already satisfied: sympy in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch<4.0,>=1.12.0->lightning) (1.12)\n",
      "Requirement already satisfied: networkx in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch<4.0,>=1.12.0->lightning) (3.0)\n",
      "Requirement already satisfied: jinja2 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch<4.0,>=1.12.0->lightning) (3.1.2)\n",
      "Requirement already satisfied: nvidia-cuda-nvrtc-cu11==11.7.99 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch<4.0,>=1.12.0->lightning) (11.7.99)\n",
      "Requirement already satisfied: nvidia-cuda-runtime-cu11==11.7.99 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch<4.0,>=1.12.0->lightning) (11.7.99)\n",
      "Requirement already satisfied: nvidia-cuda-cupti-cu11==11.7.101 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch<4.0,>=1.12.0->lightning) (11.7.101)\n",
      "Requirement already satisfied: nvidia-cudnn-cu11==8.5.0.96 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch<4.0,>=1.12.0->lightning) (8.5.0.96)\n",
      "Requirement already satisfied: nvidia-cublas-cu11==11.10.3.66 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch<4.0,>=1.12.0->lightning) (11.10.3.66)\n",
      "Requirement already satisfied: nvidia-cufft-cu11==10.9.0.58 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch<4.0,>=1.12.0->lightning) (10.9.0.58)\n",
      "Requirement already satisfied: nvidia-curand-cu11==10.2.10.91 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch<4.0,>=1.12.0->lightning) (10.2.10.91)\n",
      "Requirement already satisfied: nvidia-cusolver-cu11==11.4.0.1 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch<4.0,>=1.12.0->lightning) (11.4.0.1)\n",
      "Requirement already satisfied: nvidia-cusparse-cu11==11.7.4.91 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch<4.0,>=1.12.0->lightning) (11.7.4.91)\n",
      "Requirement already satisfied: nvidia-nccl-cu11==2.14.3 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch<4.0,>=1.12.0->lightning) (2.14.3)\n",
      "Requirement already satisfied: nvidia-nvtx-cu11==11.7.91 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch<4.0,>=1.12.0->lightning) (11.7.91)\n",
      "Requirement already satisfied: triton==2.0.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from torch<4.0,>=1.12.0->lightning) (2.0.0)\n",
      "Requirement already satisfied: wheel in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from nvidia-cublas-cu11==11.10.3.66->torch<4.0,>=1.12.0->lightning) (0.42.0)\n",
      "Requirement already satisfied: cmake in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from triton==2.0.0->torch<4.0,>=1.12.0->lightning) (3.27.9)\n",
      "Requirement already satisfied: lit in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from triton==2.0.0->torch<4.0,>=1.12.0->lightning) (17.0.6)\n",
      "Requirement already satisfied: attrs>=17.3.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<2025.0,>2021.06.0->lightning) (23.1.0)\n",
      "Requirement already satisfied: multidict<7.0,>=4.5 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<2025.0,>2021.06.0->lightning) (6.0.4)\n",
      "Requirement already satisfied: yarl<2.0,>=1.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<2025.0,>2021.06.0->lightning) (1.9.4)\n",
      "Requirement already satisfied: frozenlist>=1.1.1 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<2025.0,>2021.06.0->lightning) (1.4.0)\n",
      "Requirement already satisfied: aiosignal>=1.1.2 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<2025.0,>2021.06.0->lightning) (1.3.1)\n",
      "Requirement already satisfied: async-timeout<5.0,>=4.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]<2025.0,>2021.06.0->lightning) (4.0.3)\n",
      "Requirement already satisfied: MarkupSafe>=2.0 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from jinja2->torch<4.0,>=1.12.0->lightning) (2.1.3)\n",
      "Requirement already satisfied: charset-normalizer<4,>=2 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from requests->fsspec[http]<2025.0,>2021.06.0->lightning) (3.3.2)\n",
      "Requirement already satisfied: idna<4,>=2.5 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from requests->fsspec[http]<2025.0,>2021.06.0->lightning) (3.6)\n",
      "Requirement already satisfied: urllib3<3,>=1.21.1 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from requests->fsspec[http]<2025.0,>2021.06.0->lightning) (2.1.0)\n",
      "Requirement already satisfied: certifi>=2017.4.17 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from requests->fsspec[http]<2025.0,>2021.06.0->lightning) (2023.11.17)\n",
      "Requirement already satisfied: mpmath>=0.19 in /home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages (from sympy->torch<4.0,>=1.12.0->lightning) (1.3.0)\n"
     ]
    }
   ],
   "source": [
    "!pip install \"neuromancer[examples] @ git+https://github.com/pnnl/neuromancer.git@master\"\n",
    "!pip install lightning "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Imports\n",
    "\n",
    "(The user might need to install PyTorch Lightning). If so, please run \n",
    "\n",
    "```\n",
    "pip install lightning\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "LWyvndXlz0Fv"
   },
   "source": [
    "### Import"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "id": "KbP0n-4evRqt"
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import numpy as np\n",
    "import cvxpy\n",
    "import lightning.pytorch as pl\n",
    "from cvxpylayers.torch import CvxpyLayer\n",
    "\n",
    "# plotting\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.patheffects as patheffects\n",
    "\n",
    "# neuromancer\n",
    "from neuromancer.trainer import Trainer, LitTrainer\n",
    "from neuromancer.problem import Problem\n",
    "from neuromancer.constraint import variable\n",
    "from neuromancer.dataset import DictDataset\n",
    "from neuromancer.loss import PenaltyLoss\n",
    "from neuromancer.modules import blocks\n",
    "from neuromancer.system import Node\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Problem Formulation\n",
    "\n",
    "Specifically we will focus on solving the [Rosenbrock problem](https://en.wikipedia.org/wiki/Rosenbrock_function):\n",
    "\n",
    "$$\n",
    "\\begin{align}\n",
    "&\\text{minimize } &&  (1-x_1)^2 + p(x_2-x_1^2)^2\\\\\n",
    "&\\text{subject to} && Ax \\le b\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "with parameters $p, b$ and decision variables $x= [x_1, x_2]$.\n",
    "\n",
    "In this tutorial, we will use neuromancer to train the neural network to minimize the nonlinear objective function,\n",
    "and cvxpy layers to project the solution onto feasible region."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "nx = 2              #  number of decision variables\n",
    "n_con = 4           #  number of constraints\n",
    "n_p = 1             #  number of objective parameters\n",
    "\n",
    "# generate fixed parameters of the inequality constraints: Ax <= b\n",
    "torch.manual_seed(7)\n",
    "A = torch.FloatTensor(n_con, nx).uniform_(-4, 4)\n",
    "x0 = torch.full([nx], 0.5)       # controls center of the polytope\n",
    "s0 = torch.full([n_con], 0.2)    # controls offset from the center of the polytope\n",
    "b0 = A.mv(x0) + s0"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "_WH7o7Wu1epw"
   },
   "source": [
    "## Dataset\n",
    "\n",
    "We constructy the dataset by sampling the parametric space."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "id": "_r6p2p6myHAh"
   },
   "outputs": [],
   "source": [
    "data_seed = 408  # random seed used for simulated data\n",
    "np.random.seed(data_seed)\n",
    "torch.manual_seed(data_seed);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "JZ9qrw0tlJhs"
   },
   "source": [
    "Randomly sample parameters from a uniform distribution: $0.5\\le p\\le2.0$;  $0.2\\le a\\le1.2$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "id": "Nu58M-8JyHy6"
   },
   "outputs": [],
   "source": [
    "nsim = 1000  # number of datapoints: increase sample density for more robust results\n",
    "# create dictionaries with sampled datapoints with uniform distribution\n",
    "p_low, p_high = 0.2, 5.0,\n",
    "b_low, b_high = 0.0, 1.0,\n",
    "\n",
    "def data_setup_function(nsim, p_low, p_high, b_low, b_high): \n",
    "    # we sample objective and constraints parameters\n",
    "    samples_train = {\"p\": torch.FloatTensor(nsim, n_p).uniform_(p_low, p_high),\n",
    "                    \"b_param\": torch.FloatTensor(nsim, n_con).uniform_(b_low, b_high)}\n",
    "    samples_dev = {\"p\": torch.FloatTensor(nsim, n_p).uniform_(p_low, p_high),\n",
    "                \"b_param\": torch.FloatTensor(nsim, n_con).uniform_(b_low, b_high)}\n",
    "    samples_test = {\"p\": torch.FloatTensor(nsim, n_p).uniform_(p_low, p_high),\n",
    "                    \"b_param\": torch.FloatTensor(nsim, n_con).uniform_(b_low, b_high)}\n",
    "    # create named dictionary datasets\n",
    "    train_data = DictDataset(samples_train, name='train')\n",
    "    dev_data = DictDataset(samples_dev, name='dev')\n",
    "    test_data = DictDataset(samples_test, name='test')\n",
    "    batch_size = 32\n",
    "\n",
    "    return train_data, dev_data, test_data, batch_size"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Y2htUaWMDjsk"
   },
   "source": [
    "## Primal Solution Map Architecture\n",
    "\n",
    "A neural network mapping problem parameters onto primal decision variables:  \n",
    "$$x = \\pi(\\theta)$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "id": "Ta_I_pjyyLzf"
   },
   "outputs": [],
   "source": [
    "# define neural architecture for the trainable solution map\n",
    "# mapping problem parameters to decitionv ariables\n",
    "func = blocks.MLP(insize=n_con+n_p, outsize=nx,\n",
    "                bias=True,\n",
    "                linear_map=torch.nn.Linear,\n",
    "                nonlin=nn.ReLU,\n",
    "                hsizes=[80] * 4)\n",
    "# wrap neural net into symbolic representation of the solution map via the Node class:\n",
    "# sol_map(p, bparam) -> xy\n",
    "sol_map = Node(func, ['p', 'b_param'], ['xy'], name='map')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Lxj77EFj7EO-"
   },
   "source": [
    "## Objective in NeuroMANCER\n",
    "\n",
    "\n",
    "We want to minimize the objective:\n",
    "$$\n",
    "\\begin{align}\n",
    "&\\text{minimize } &&  (1-x_1)^2 + p(x_2-x_1^2)^2\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "with $x = [x_1, x_2]$ being decision variables and $p$ being problem parameter."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "id": "bcoVjphjyPp9"
   },
   "outputs": [],
   "source": [
    "# define decision variables\n",
    "xy = variable(\"xy\")\n",
    "x = variable(\"xy\")[:, [0]]\n",
    "y = variable(\"xy\")[:, [1]]\n",
    "# problem parameters sampled in the dataset\n",
    "p = variable('p')\n",
    "b_param = variable('b_param')\n",
    "\n",
    "# objective function\n",
    "f = (1-x)**2 + p*(y-x**2)**2\n",
    "nm_obj = f.minimize(weight=10.0, name='obj')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Cvxpy projection layer\n",
    "\n",
    "We will use cvxpy layer to implement the projection onto the polytopic constraints:\n",
    "\n",
    "$$\n",
    "\\begin{align}\n",
    "& \\hat{x}  = \\text{argmin}_x && ||x -  \\hat{x}  ||_2^2 \\\\\n",
    "&\\text{subject to} && A \\hat{x} \\le b\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "with $x$ being solution obtained from the neural network $x = \\pi(\\theta)$, and $\\hat{x}$ being projected solution onto the feasible set satisfying $A \\hat{x} \\le b$. Here the problem constraints are parametrized by $b$ and solution from neural network $x$. Hence we can compactly represent this projection operator as:  \n",
    "\n",
    "$$\\hat{x} = \\text{proj}_{A x \\le b}(x, b) $$\n",
    "\n",
    "Cvxpy layers allow us to use this projection operator as a differentiable layer in our end-to-end solver pipeline.\n",
    "\n",
    "\n",
    "<img src=\"./figs/cvxpylayers_overview.png\" width=\"600\">  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# constants, parameters, and variables\n",
    "A_cvxpy = A.detach().numpy()\n",
    "b0_cvxpy = b0.detach().numpy()\n",
    "b_cvxpy = cvxpy.Parameter(n_con)\n",
    "xy_net = cvxpy.Parameter(nx)      # primal decision from neural net\n",
    "xy_cvxpy = cvxpy.Variable(nx)     # cvxpy decision variable\n",
    "\n",
    "# projection problem formulation\n",
    "cvxpy_obj = cvxpy.Minimize(1.0 * cvxpy.sum_squares(xy_net - xy_cvxpy))\n",
    "cvxpy_cons = [xy_cvxpy@A_cvxpy.T <= b0_cvxpy + b_cvxpy]\n",
    "cvxpy_prob = cvxpy.Problem(cvxpy_obj, cvxpy_cons)\n",
    "\n",
    "# cvxpy layer\n",
    "cvxpy_layer = CvxpyLayer(cvxpy_prob,\n",
    "                   parameters=[b_cvxpy, xy_net],\n",
    "                   variables=[xy_cvxpy])\n",
    "\n",
    "# symbolic wrapper: sol_map(bparam, xy) -> xy\n",
    "project = Node(cvxpy_layer, ['b_param', 'xy'], ['xy_cvx'], name='proj')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that in the above code, we did not need to wrap A_cvxpy, b0_cvxpy etc within a LightningModule class"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Self-supervised loss\n",
    "\n",
    "We can use the correction form the cvxpylayer as a supervisory signal for the neural network alongside with the objective minimization loss function term. This extra term can be used as a guide for the neural network to satisfy constraints of the problem by following the projected solution. The larger the weigthing factor of this loss function term the closer the neural network will be to feasible region on its own without the subsequent projection."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# corrected variable by the cvxpy layer\n",
    "xy_cvx = variable(\"xy_cvx\")\n",
    "# cvxpy-supervised loss for the neural net\n",
    "residual = torch.abs(xy - xy_cvx)\n",
    "cvxp_loss = 1.*(residual == 0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Construct differentiable parametric optimization problem \n",
    "\n",
    "Here we put all the pieces together and construct differentiable parametric constrained optimization problem with neural network and cvxpy projection layer as solvers."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 496
    },
    "id": "n7VPa9Wc8JRB",
    "outputId": "0da17c45-6370-4f46-f626-bd5686b94bfc"
   },
   "outputs": [],
   "source": [
    "# constrained optimization problem construction\n",
    "objectives = [nm_obj, cvxp_loss]\n",
    "constraints = []\n",
    "nodes = [sol_map, project]\n",
    "\n",
    "# create penalty method loss function\n",
    "loss = PenaltyLoss(objectives, constraints)\n",
    "# construct constrained optimization problem\n",
    "problem = Problem(nodes, loss)\n",
    "# plot computational graph\n",
    "# problem.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "icWSMeG28SKc"
   },
   "source": [
    "## Parametric Problem Solution in NeuroMANCER\n",
    "\n",
    "Here we will use stochastic gradient descent to optimize the neural network $x = \\pi({\\theta})$ to solve a distribution of sampled problem instances."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "id": "rk1bRczByUvl"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "GPU available: True (cuda), used: True\n",
      "TPU available: False, using: 0 TPU cores\n",
      "IPU available: False, using: 0 IPUs\n",
      "HPU available: False, using: 0 HPUs\n",
      "You are using a CUDA device ('NVIDIA RTX A6000') that has Tensor Cores. To properly utilize them, you should set `torch.set_float32_matmul_precision('medium' | 'high')` which will trade-off precision for performance. For more details, read https://pytorch.org/docs/stable/generated/torch.set_float32_matmul_precision.html#torch.set_float32_matmul_precision\n",
      "/home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages/lightning/pytorch/callbacks/model_checkpoint.py:639: Checkpoint directory ./ exists and is not empty.\n",
      "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0,1,2,3,4,5,6,7]\n",
      "\n",
      "  | Name    | Type    | Params\n",
      "------------------------------------\n",
      "0 | problem | Problem | 20.1 K\n",
      "------------------------------------\n",
      "20.1 K    Trainable params\n",
      "0         Non-trainable params\n",
      "20.1 K    Total params\n",
      "0.080     Total estimated model params size (MB)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sanity Checking DataLoader 0:   0%|          | 0/2 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:441: The 'val_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=159` in the `DataLoader` to improve performance.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sanity Checking DataLoader 0:  50%|█████     | 1/2 [00:05<00:05,  0.18it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/birm560/neuromancer/src/neuromancer/constraint.py:169: UserWarning: Using a target size (torch.Size([])) that is different to the input size (torch.Size([32, 2])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.\n",
      "  loss = F.l1_loss(left, right)\n",
      "/home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages/lightning/pytorch/utilities/data.py:77: Trying to infer the `batch_size` from an ambiguous collection. The batch size we found is 32. To avoid any miscalculations, use `self.log(..., batch_size=batch_size)`.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                                                                           "
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:441: The 'train_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=159` in the `DataLoader` to improve performance.\n",
      "/home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages/lightning/pytorch/loops/fit_loop.py:293: The number of training batches (32) is smaller than the logging interval Trainer(log_every_n_steps=50). Set a lower value for log_every_n_steps if you want to see logs for the training epoch.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 0: 100%|██████████| 32/32 [00:12<00:00,  2.53it/s, v_num=24, train_loss_step=0.539]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/birm560/neuromancer/src/neuromancer/constraint.py:169: UserWarning: Using a target size (torch.Size([])) that is different to the input size (torch.Size([8, 2])). This will likely lead to incorrect results due to broadcasting. Please ensure they have the same size.\n",
      "  loss = F.l1_loss(left, right)\n",
      "/home/birm560/miniconda3/envs/neuromancer3/lib/python3.10/site-packages/lightning/pytorch/utilities/data.py:77: Trying to infer the `batch_size` from an ambiguous collection. The batch size we found is 8. To avoid any miscalculations, use `self.log(..., batch_size=batch_size)`.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 0: 100%|██████████| 32/32 [00:21<00:00,  1.48it/s, v_num=24, train_loss_step=0.539, dev_loss=0.614, train_loss_epoch=2.680]epoch: 0  : 2.6311771869659424\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Epoch 0, global step 32: 'dev_loss' reached 0.61403 (best 0.61403), saving model to './epoch=0-step=32.ckpt' as top 1\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1: 100%|██████████| 32/32 [00:21<00:00,  1.46it/s, v_num=24, train_loss_step=0.423, dev_loss=0.590, train_loss_epoch=0.789]epoch: 1  : 0.7808655500411987\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Epoch 1, global step 64: 'dev_loss' reached 0.59040 (best 0.59040), saving model to './epoch=1-step=64.ckpt' as top 1\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 2: 100%|██████████| 32/32 [00:21<00:00,  1.47it/s, v_num=24, train_loss_step=0.555, dev_loss=0.646, train_loss_epoch=0.618]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Epoch 2, global step 96: 'dev_loss' was not in top 1\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch: 2  : 0.6163569688796997\n",
      "Epoch 3: 100%|██████████| 32/32 [00:22<00:00,  1.40it/s, v_num=24, train_loss_step=0.220, dev_loss=0.256, train_loss_epoch=0.552]epoch: 3  : 0.5445245504379272\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Epoch 3, global step 128: 'dev_loss' reached 0.25570 (best 0.25570), saving model to './epoch=3-step=128-v1.ckpt' as top 1\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 4: 100%|██████████| 32/32 [00:23<00:00,  1.39it/s, v_num=24, train_loss_step=0.221, dev_loss=0.303, train_loss_epoch=0.483]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Epoch 4, global step 160: 'dev_loss' was not in top 1\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch: 4  : 0.47689807415008545\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "`Trainer.fit` stopped: `max_epochs=5` reached.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 4: 100%|██████████| 32/32 [00:23<00:00,  1.36it/s, v_num=24, train_loss_step=0.221, dev_loss=0.303, train_loss_epoch=0.483]\n"
     ]
    }
   ],
   "source": [
    "lit_trainer = LitTrainer(epochs=5, patience=10, accelerator='gpu', devices=[1])\n",
    "lit_trainer.fit(problem, data_setup_function, nsim=nsim, p_low=p_low, p_high=p_high, b_low=b_low, b_high=b_high)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "0hhUw4PVBWmb"
   },
   "source": [
    "## Plot the solution"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 281
    },
    "id": "kvYCfjq6zxxC",
    "outputId": "322e5b72-b93d-4d9e-a913-8703aad67d1a"
   },
   "outputs": [],
   "source": [
    "def plot_pNLP(p, b_param, savedir=None):\n",
    "    # sample primal solution domain\n",
    "    x1 = np.arange(-0.5, 1.5, 0.02)\n",
    "    y1 = np.arange(-0.5, 1.5, 0.02)\n",
    "    xx, yy = np.meshgrid(x1, y1)\n",
    "    xy_samples = np.stack([xx.flatten(), yy.flatten()])\n",
    "\n",
    "    # eval constraints Ax - b <= 0\n",
    "    A_np = A.detach().numpy()\n",
    "    b = b0 + b_param\n",
    "    b_np = b.detach().numpy()\n",
    "    C_samples = np.subtract(np.matmul(A_np, xy_samples).T, b_np).T\n",
    "    C_samples = C_samples.reshape(n_con, x1.shape[0], y1.shape[0])\n",
    "\n",
    "    # eval objective\n",
    "    p_np = p.detach().numpy()\n",
    "    J = (1 - xx) ** 2 + p_np * (yy - xx ** 2) ** 2\n",
    "\n",
    "    # plot objective and constraints\n",
    "    fig, ax = plt.subplots(1, 1)\n",
    "    cp = ax.contourf(xx, yy, J,\n",
    "                     levels=[0, 0.05, 0.2, 0.5, 1.0, 2.0, 4.0, 6.0, 8.0, 16],\n",
    "                     alpha=0.6)\n",
    "    fig.colorbar(cp)\n",
    "    ax.set_title('Rosenbrock problem')\n",
    "    for k in range(n_con):\n",
    "        cg1 = ax.contour(xx, yy, -C_samples[k], [0],\n",
    "                         colors='mediumblue', alpha=0.7)\n",
    "        plt.setp(cg1.collections,\n",
    "                 path_effects=[patheffects.withTickedStroke()], alpha=0.7)\n",
    "\n",
    "    # Solution to pNLP via Neuromancer\n",
    "    datapoint = {'p': p, 'b_param': b_param,\n",
    "                 'name': 'test'}\n",
    "    # evaluate neuromancer model\n",
    "    model_out = problem.step(datapoint)\n",
    "    # neural net solution\n",
    "    x_nm_net = model_out[\"xy\"][0].detach().numpy()\n",
    "    y_nm_net = model_out[\"xy\"][1].detach().numpy()\n",
    "    # cvxpy projected solution\n",
    "    x_nm_cvx = model_out[\"xy_cvx\"][0].detach().numpy()\n",
    "    y_nm_cvx = model_out[\"xy_cvx\"][1].detach().numpy()\n",
    "\n",
    "    # plot optimal solutions CasADi vs Neuromancer\n",
    "    ax.plot(x_nm_net, y_nm_net, 'r*', fillstyle='none',\n",
    "            markersize=16, label='net')\n",
    "    ax.plot(x_nm_cvx, y_nm_cvx, 'g*', fillstyle='none',\n",
    "            markersize=14, label='cvxpy')\n",
    "    # plot projection step\n",
    "    ax.plot([x_nm_net, x_nm_cvx],\n",
    "            [y_nm_net, y_nm_cvx], '--', c='orange')\n",
    "    plt.legend(bbox_to_anchor=(1.0, 0.15))\n",
    "\n",
    "    if savedir is not None:\n",
    "        if not os.path.exists(savedir):\n",
    "            os.mkdir(savedir)\n",
    "        figure_path = os.path.join(savedir, f'pNLP_p={p}_bsum={b_np}.png')\n",
    "        plt.savefig(figure_path)\n",
    "        return figure_path\n",
    "    else:\n",
    "        plt.show(block=True)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "id": "yD5kAnjy4CUL"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_229275/2558518230.py:29: MatplotlibDeprecationWarning: The collections attribute was deprecated in Matplotlib 3.8 and will be removed two minor releases later.\n",
      "  plt.setp(cg1.collections,\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjEAAAGzCAYAAADe/0a6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOy9d5xcdb3//zxn+mzvfTebTdu0TQ8JCSEQCKFIVKr6BUGwwb1iVB7iTwHRay56UVS4RlQMXEWKIFIDISRASEgvu8lmky3Z3nuZPuf3x2QmO9vLzOzM7uf5eOwjmTOfc+Yzs2Ve83o3SVEUBYFAIBAIBIIQQ57oDQgEAoFAIBCMBSFiBAKBQCAQhCRCxAgEAoFAIAhJhIgRCAQCgUAQkggRIxAIBAKBICQRIkYgEAgEAkFIIkSMQCAQCASCkESIGIFAIBAIBCGJEDECgUAgEAhCEiFiBIIgQZIk7r///onehofLL7+c+fPnT/Q2huWrX/0q4eHhI1orSRKPPvqofzckEAgChhAxgpBm+/btSJLk+VKr1aSlpfHVr36V6urqid6eQCAQCPyIeqI3IBD4gscee4zs7GzMZjOfffYZ27dvZ+/evRQUFKDX6yd6ewKBQCDwA0LECCYFmzZtYtmyZQDcc889xMfH8/jjj/PGG29wyy23TPDu/E93dzdhYWETvQ2fYDab0Wq1yLIwigUCwdCIvxKCScnatWsBKCkp8Tr+4YcfsnbtWsLCwoiOjubGG2+ksLDQa01nZycPPPAA06ZNQ6fTkZiYyFVXXcXRo0e91h04cIBrrrmGqKgojEYj69at49NPP/Va8+ijjyJJEsXFxXz1q18lOjqaqKgo7rrrLnp6egbc+9///ndmz56NXq9n6dKlfPzxxwNe8/Tp03zpS18iJiaGNWvWAGC32/nZz35GTk4OOp2OadOm8aMf/QiLxdLvcd59913WrVtHREQEkZGRLF++nBdeeGHI1/X999/HaDRy++23Y7fbB13nzqc5cuQIq1evxmAwkJ2dzbZt27zW7dmzB0mSePHFF/nxj39MWloaRqORjo4OAF555RWWLl2KwWAgPj6er3zlK4OGCUtLS9m4cSNhYWGkpqby2GOPoSjKkM8HoLq6mrvvvpukpCR0Oh3z5s3j2WefHXCfL7/8Mj/96U9JS0sjIiKCm266ifb2diwWCw888ACJiYmEh4dz1113DfiaCwQC3yKcGMGk5Pz58wDExMR4jn3wwQds2rSJ6dOn8+ijj2Iymfj973/PpZdeytGjR5k2bRoA3/zmN/nnP//J/fffz9y5c2lubmbv3r0UFhayZMkSwCWGNm3axNKlS3nkkUeQZZm//vWvXHHFFXzyySesWLHCaz+33HIL2dnZbN26laNHj/LnP/+ZxMREHn/8ca91H330ES+99BL/+Z//iU6n43//93+55pprOHjwYL8k25tvvpmZM2fyi1/8wvNmfc899/Dcc89x00038b3vfY8DBw6wdetWCgsL+de//uU5d/v27dx9993MmzePhx56iOjoaI4dO8aOHTv40pe+NOBr+tZbb3HTTTdx66238uyzz6JSqYb8HrS2tnLttddyyy23cPvtt/Pyyy/zrW99C61Wy9133+219mc/+xlarZbvf//7WCwWtFot27dv56677mL58uVs3bqV+vp6fvvb3/Lpp59y7NgxoqOjPec7HA6uueYaLrnkEn75y1+yY8cOHnnkEex2O4899tige6yvr+eSSy7xJFUnJCTw7rvv8rWvfY2Ojg4eeOABr/Vbt27FYDDwwx/+kOLiYn7/+9+j0WiQZZnW1lYeffRRTzgzOzubhx9+eMjXSCAQjBNFIAhh/vrXvyqA8sEHHyiNjY1KZWWl8s9//lNJSEhQdDqdUllZ6Vm7aNEiJTExUWlubvYcO3HihCLLsnLHHXd4jkVFRSn33XffoI/pdDqVmTNnKhs3blScTqfneE9Pj5Kdna1cddVVnmOPPPKIAih333231zU+//nPK3FxcV7HAAVQDh8+7DlWXl6u6PV65fOf/3y/a95+++1e5x8/flwBlHvuucfr+Pe//30FUD788ENFURSlra1NiYiIUFauXKmYTKZ+z83NunXrlHnz5imKoiivvvqqotFolHvvvVdxOByDvja9zwWUJ554wnPMYrF4vgdWq1VRFEXZvXu3AijTp09Xenp6PGutVquSmJiozJ8/32uPb731lgIoDz/8sOfYnXfeqQDKf/zHf3g9j+uuu07RarVKY2Oj5zigPPLII57bX/va15SUlBSlqanJa/+33XabEhUV5dmTe5/z58/37F1RFOX2229XJElSNm3a5HX+qlWrlKysrGFfJ4FAMD5EOEkwKdiwYQMJCQlkZGRw0003ERYWxhtvvEF6ejoAtbW1HD9+nK9+9avExsZ6zlu4cCFXXXUV77zzjudYdHQ0Bw4coKamZsDHOn78OOfOneNLX/oSzc3NNDU10dTURHd3N1deeSUff/wxTqfT65xvfvObXrfXrl1Lc3OzJ2ziZtWqVSxdutRzOzMzkxtvvJH33nsPh8Mx5DXdz2HLli1ex7/3ve8B8PbbbwOwc+dOOjs7+eEPf9gv6VmSpH7P9x//+Ae33nor3/jGN/jjH/844lwVtVrNN77xDc9trVbLN77xDRoaGjhy5IjX2jvvvBODweC5ffjwYRoaGvj2t7/ttcfrrruOOXPmeJ5Lb3qXp7udFavVygcffDDg/hRF4dVXX+WGG25AURTP97GpqYmNGzfS3t7eL4R4xx13oNFoPLdXrlyJoij9nKWVK1dSWVk5ZMhNIBCMHyFiBJOCp59+mp07d/LPf/6Ta6+9lqamJnQ6nef+8vJyAGbPnt3v3NzcXI8IAfjlL39JQUEBGRkZrFixgkcffZTS0lLP+nPnzgGuN96EhASvrz//+c9YLBba29u9HiMzM9PrtjvM1dra6nV85syZ/fY3a9Ysenp6aGxs9DqenZ3tdbu8vBxZlpkxY4bX8eTkZKKjoz2vgTtPaCQ9YMrKyvjKV77CF7/4RX7/+98PKHIGIzU1tV+y8axZs4CL4b6hngsM/P2aM2eO5343siwzffr0ET2Wm8bGRtra2njmmWf6fR/vuusuABoaGrzO6ft9jIqKAiAjI6PfcafT2e/nQCAQ+BaREyOYFKxYscJTnbR582bWrFnDl770JYqKikbcCM3NLbfcwtq1a/nXv/7F+++/z69+9Ssef/xxXnvtNTZt2uRxWX71q1+xaNGiAa/R9zEHyx9RRpB4Ohi9nYvejEZoDEdKSgopKSm88847HD582PMa+5rBnos/cX8fv/KVr3DnnXcOuGbhwoVetwf7Pvrj+ysQCIZHiBjBpEOlUrF161bWr1/PU089xQ9/+EOysrIAKCoq6rf+zJkzxMfHe7kGKSkpfPvb3+bb3/42DQ0NLFmyhP/6r/9i06ZN5OTkABAZGcmGDRt8une3y9Obs2fPYjQaSUhIGPLcrKwsnE4n586dIzc313O8vr6etrY2z2vg3n9BQUE/16Yver2et956iyuuuIJrrrmGjz76iHnz5o3oudTU1PQr/T579iyAJ4l6qOcCru/XFVdc4XVfUVGR5343TqeT0tJSj/syksdKSEggIiICh8Ph8++jQCAIDCKcJJiUXH755axYsYInn3wSs9lMSkoKixYt4rnnnqOtrc2zrqCggPfff59rr70WcFW59A0BJCYmkpqa6imZXbp0KTk5OfzP//wPXV1d/R67b9hnNOzfv98rD6OyspJ///vfXH311cNWA7mfw5NPPul1/Ne//jXgyicBuPrqq4mIiGDr1q2YzWavtQM5B1FRUbz33nueUvO+ZeuDYbfb+eMf/+i5bbVa+eMf/0hCQoJX3s9ALFu2jMTERLZt2+ZVqvzuu+9SWFjoeS69eeqpp7yex1NPPYVGo+HKK68c8DFUKhVf/OIXefXVVykoKOh3/3i+jwKBIDAIJ0YwafnBD37AzTffzPbt2/nmN7/Jr371KzZt2sSqVav42te+5imxjoqK8szT6ezsJD09nZtuuom8vDzCw8P54IMPOHToEE888QTgyr/485//zKZNm5g3bx533XUXaWlpVFdXs3v3biIjI3nzzTfHtOf58+ezceNGrxJrgJ/+9KfDnpuXl8edd97JM888Q1tbG+vWrePgwYM899xzbN68mfXr1wMuB+k3v/kN99xzD8uXL/f0mjlx4gQ9PT0899xz/a4dHx/Pzp07WbNmDRs2bGDv3r2kpaUNuZ/U1FQef/xxzp8/z6xZs3jppZc4fvw4zzzzjFdy7EBoNBoef/xx7rrrLtatW8ftt9/uKbGeNm0a3/3ud73W6/V6duzYwZ133snKlSt59913efvtt/nRj340pIP13//93+zevZuVK1dy7733MnfuXFpaWjh69CgffPABLS0tQ+5TIBBMMBNYGSUQjBt3ifWhQ4f63edwOJScnBwlJydHsdvtiqIoygcffKBceumlisFgUCIjI5UbbrhBOX36tOcci8Wi/OAHP1Dy8vKUiIgIJSwsTMnLy1P+93//t9/1jx07pnzhC19Q4uLiFJ1Op2RlZSm33HKLsmvXLs8adzl07zLf3vsuKyvzHAOU++67T/nb3/6mzJw5U9HpdMrixYuV3bt3e5072DUVRVFsNpvy05/+VMnOzlY0Go2SkZGhPPTQQ4rZbO639o033lBWr17teS1WrFih/OMf//Dc37vE2k1xcbGSkpKi5ObmDvj4fc89fPiwsmrVKkWv1ytZWVnKU0895bXOXbr8yiuv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",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# sample random scenario\n",
    "p = torch.FloatTensor(n_p).uniform_(p_low, p_high)\n",
    "b_param = torch.rand(n_con)\n",
    "# plot single random scenario\n",
    "plot_pNLP(p, b_param)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "colab": {
   "provenance": []
  },
  "kernelspec": {
   "display_name": "neuromancer3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
